﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using SistemaGO_Library.Persistencia.BD;
using SistemaGO_Library.Entidades.Cancelamento;
using SistemaGO_Library.Entidades.Mudanca;
using SistemaGO_Library.Entidades.Usuario;
using SistemaGO_Library;

namespace SistemaGO_Library.Entidades.Ocorrencia
{
    class RepositorioOcorrencia : IRepositorioOcorrencia
    {
        private BD bd = new BD();


        //Descrição: Método que é usado nas regras de negócio do sistema identificando se uma ocorrência que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: cod = atributo identificador da ocorrência que vai dizer se existe ou não.
        public bool existeOcorrencia(int cod) {
            string sql = "SELECT ocorrencia_cod FROM tb_ocorrencia WHERE ocorrencia_cod = " + cod + " ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["ocorrencia_cod"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {  
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de uma ocorrência no banco de dados.
        //Valores: oco = ocorrência passada para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public int inserirOcorrencia(Ocorrencia oco) {
            int codigo_inserido = -1;
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_ocorrencia (categoria_cod, ocorrencia_av_rua, ocorrencia_bairro, ocorrencia_ponto_ref, ocorrencia_cep, denunciante_nome, denunciante_email, denunciante_celular, ocorrencia_envio, ocorrencia_imagem, ocorrencia_data_cadastro, ocorrencia_data_conclusao, ocorrencia_situacao) ");
            sql.Append("VALUES (" + oco.Categoria_cod + ", '" + oco.Ocorrencia_av_rua + "', '" + oco.Ocorrencia_bairro + "', '" + oco.Ocorrencia_ponto_ref + "', '" + oco.Ocorrencia_cep + "', '" + oco.Denunciante_nome + "', '" + oco.Denunciante_email + "', '" + oco.Denunciante_celular + "', '" + oco.Ocorrencia_envio + "', '" + oco.Ocorrencia_imagem + "', '" + oco.Ocorrencia_data_cadastro.ToString("MM/dd/yyyy") + "', '" + oco.Ocorrencia_data_conclusao.ToString("MM/dd/yyyy") + "', '" + oco.Ocorrencia_situacao + "')");
            bd.rodarComando(sql.ToString());

            StringBuilder sql2 = new StringBuilder();

            sql2.Append("SELECT ocorrencia_cod FROM tb_ocorrencia WHERE categoria_cod = " + oco.Categoria_cod + " AND ocorrencia_av_rua = '" + oco.Ocorrencia_av_rua + "' AND ocorrencia_bairro = '" + oco.Ocorrencia_bairro + "' AND ocorrencia_ponto_ref = '" + oco.Ocorrencia_ponto_ref + "' AND ocorrencia_cep = '" + oco.Ocorrencia_cep + "' AND denunciante_nome = '" + oco.Denunciante_nome + "' AND denunciante_email = '" + oco.Denunciante_email + "' AND  denunciante_celular = '" + oco.Denunciante_celular + "' AND  ocorrencia_envio = '" + oco.Ocorrencia_envio + "' AND  ocorrencia_imagem = '" + oco.Ocorrencia_imagem + "' AND  ocorrencia_data_cadastro = '" + oco.Ocorrencia_data_cadastro.ToString("MM/dd/yyyy") + "' AND  ocorrencia_data_conclusao = '" + oco.Ocorrencia_data_conclusao.ToString("MM/dd/yyyy") + "' AND  ocorrencia_situacao = '" + oco.Ocorrencia_situacao + "'");

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql2.ToString(), conexao);
                SqlDataReader dr = comando.ExecuteReader();
                
                while (dr.Read()) {
                    codigo_inserido = int.Parse(dr["ocorrencia_cod"].ToString());
                }
            }

            return codigo_inserido;
        }

        //Descrição: Método que realiza busca de uma ocorrência no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca.
        public Ocorrencia buscarOcorrencia(int cod) {
            Ocorrencia oco = null;
            string sql = "SELECT * FROM tb_ocorrencia WHERE ocorrencia_cod = " + cod + " ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    oco = new Ocorrencia();
                    oco.Ocorrencia_cod = int.Parse(dr["ocorrencia_cod"].ToString());
                    oco.Categoria_cod = int.Parse(dr["categoria_cod"].ToString());
                    oco.Ocorrencia_av_rua = dr["ocorrencia_av_rua"].ToString();
                    oco.Ocorrencia_bairro = dr["ocorrencia_bairro"].ToString();
                    oco.Ocorrencia_ponto_ref = dr["ocorrencia_ponto_ref"].ToString();
                    oco.Ocorrencia_cep = dr["ocorrencia_cep"].ToString();
                    oco.Denunciante_nome = dr["denunciante_nome"].ToString();
                    oco.Denunciante_email = dr["denunciante_email"].ToString();
                    oco.Denunciante_celular = dr["denunciante_celular"].ToString();
                    oco.Ocorrencia_envio = dr["ocorrencia_envio"].ToString();
                    oco.Ocorrencia_imagem = dr["ocorrencia_imagem"].ToString();
                    oco.Ocorrencia_data_cadastro = DateTime.Parse(dr["ocorrencia_data_cadastro"].ToString());
                    oco.Ocorrencia_data_conclusao = DateTime.Parse(dr["ocorrencia_data_conclusao"].ToString());
                    oco.Ocorrencia_situacao = dr["ocorrencia_situacao"].ToString();
                }
                return oco;
            }
        }

        //Descrição: Método que realiza mudança de uma ocorrência no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca de qual ocorrência ele irá realizar a mudança, novaOcorrencia = nova ocorrência que será inserida no lugar da antiga.
        public void alterarOcorrencia(int cod, Ocorrencia novaOcorrencia) {
            Fachada fachada = Fachada.getInstance();

            Mudanca.Mudanca mudanca = new Mudanca.Mudanca();;
            Ocorrencia ocorrenciaOriginal = this.buscarOcorrencia(cod);
            ocorrenciaOriginal.Ocorrencia_situacao = "A";

            int codigo_inserido = this.inserirOcorrencia(ocorrenciaOriginal);

            mudanca.Mudanca_data = DateTime.Now;
            mudanca.Ocorrencia_cod = cod;
            mudanca.Ocorrencia_original_cod = codigo_inserido;
            mudanca.Usu_login_responsavel = fachada.Usuario.Usu_login;

            fachada.inserirMudanca(mudanca);

            string sql;
            sql = "UPDATE tb_ocorrencia SET categoria_cod = " + novaOcorrencia.Categoria_cod + ", ocorrencia_av_rua = '" + novaOcorrencia.Ocorrencia_av_rua + "', ocorrencia_bairro = '" + novaOcorrencia.Ocorrencia_bairro + "', ocorrencia_ponto_ref = '" + novaOcorrencia.Ocorrencia_ponto_ref + "', ocorrencia_cep = '" + novaOcorrencia.Ocorrencia_cep + "', denunciante_nome = '" + novaOcorrencia.Denunciante_nome + "', denunciante_email = '" + novaOcorrencia.Denunciante_email + "', denunciante_celular = '" + novaOcorrencia.Denunciante_celular + "', ocorrencia_envio = '" + novaOcorrencia.Ocorrencia_envio + "', ocorrencia_imagem = '" + novaOcorrencia.Ocorrencia_imagem + "', ocorrencia_data_cadastro = '" + novaOcorrencia.Ocorrencia_data_cadastro.ToString("MM/dd/yyyy") + "', ocorrencia_data_conclusao = '" + novaOcorrencia.Ocorrencia_data_conclusao.ToString("MM/dd/yyyy") + "', ocorrencia_situacao = '" + novaOcorrencia.Ocorrencia_situacao + "' WHERE ocorrencia_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de uma ocorrência no banco de dados.
        //Valores: cod = codigo da ocorrencia passado para que seja realizada a busca no banco para cancelamento.
        //         descricao = descriçao do motivo da ocorrencia.
        public void cancelarOcorrencia(int cod, String descricao) {
            Cancelamento.Cancelamento cancel;
            Fachada fachada = Fachada.getInstance();

            cancel = new Cancelamento.Cancelamento();

            cancel.Cancelamento_data = DateTime.Now;
            cancel.Cancelamento_descricao = descricao;
            cancel.Ocorrencia_cod = cod;
            cancel.Usu_login_responsavel = fachada.Usuario.Usu_login;

            fachada.inserirCancelamento(cancel);
            this.mudarSituacao("C", cod);
        }

        //Descrição: Método que busca o código para ser mostrado na tela.
        //Valores: nenhum, visto que ele só busca a ocorrência e retorna 
        public int buscarCodigoOcorrencia() {
            string sql = "SELECT MAX(ocorrencia_cod) FROM tb_ocorrencia";
            return bd.buscarCodigo(sql) + 1;
        }

        //Descrição: Método que busca o código para ser mostrado na tela.
        //Valores: newsituacao = nova situacao da ocorrencia.
        //         cod = codigo da ocorrencia que voce deseja mudar a situacao.
        public void mudarSituacao(string newSituacao, int cod) {
            string sql = "UPDATE tb_ocorrencia SET ocorrencia_situacao = '" + newSituacao + "' WHERE ocorrencia_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que busca o login do fiscal através do nome e depois inserido com o código da ocorrência.
        //Valores: cod = código da ocorrência para vincular o fiscal.
        //         nome = nome do fiscal para buscar o login do mesmo.
        public void vincularFiscal(int cod, string nome)
        {
            string login = "";
            string sql = "SELECT usu_login FROM tb_usuario WHERE usu_nome = '" + nome + "' ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True"))
            {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read())
                {
                    login = dr["usu_login"].ToString();
                }                
            }
            string sql2 = "INSERT INTO tb_usuario_ocorrencia (usu_login, ocorrencia_cod) VALUES ('" + login + "', " + cod + ")";
            bd.rodarComando(sql2);
            string sql3 = "UPDATE tb_ocorrencia SET ocorrencia_situacao = 'F' WHERE ocorrencia_cod = " + cod + " ";
            bd.rodarComando(sql3);
        }

        public ArrayList gerarRelatorio(int codigo_busca, DateTime data1, DateTime data2, string bairro, string denunciante)
        {
            string sql = "SELECT * FROM tb_ocorrencia";
            Ocorrencia oco = null;
            ArrayList array = new ArrayList();
 
            switch (codigo_busca)
            {
                case 1://por mes
                    sql = sql + " WHERE ocorrencia_data_cadastro BETWEEN '" + data1.ToString("MM/dd/yyyy") + "' AND '" + data2.ToString("MM/dd/yyyy")+"'";
                    break;
                case 2://bairro
                    sql = sql + " WHERE ocorrencia_bairro = '" + bairro + "'";
                    break;
                case 3://denunciante
                    sql = sql + " WHERE denunciante_nome LIKE '%" + denunciante + "%'";
                    break;
                case 12://mes e bairro
                    sql = sql + " WHERE (ocorrencia_data_cadastro BETWEEN '" + data1.ToString("MM/dd/yyyy") + "' AND '" + data2.ToString("MM/dd/yyyy")+"') AND (ocorrencia_bairro = '" + bairro + "')";
                    break;
                case 13://mes e denunciante
                    sql = sql + " WHERE (ocorrencia_data_cadastro BETWEEN '" + data1.ToString("MM/dd/yyyy") + "' AND '" + data2.ToString("MM/dd/yyyy")+"') AND (denunciante_nome LIKE '%" + denunciante + "%')";
                    break;
                case 123://mes bairro e denunciante
                    sql = sql + " WHERE (ocorrencia_data_cadastro BETWEEN '" + data1.ToString("MM/dd/yyyy") + "' AND '" + data2.ToString("MM/dd/yyyy")+"') AND (ocorrencia_bairro = '" + bairro + "') AND (denunciante_nome LIKE '%" + denunciante + "%')";
                    break;
                case 23://bairro e denunciante
                    sql = sql + " WHERE ocorrencia_bairro = '" + bairro + "' AND denunciante_nome LIKE '%" + denunciante + "%'";
                    break;
                default:
                    break;
            }

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True"))
            {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read())
                {
                    oco = new Ocorrencia();
                    oco.Ocorrencia_cod = int.Parse(dr["ocorrencia_cod"].ToString());
                    oco.Categoria_cod = int.Parse(dr["categoria_cod"].ToString());
                    oco.Ocorrencia_av_rua = dr["ocorrencia_av_rua"].ToString();
                    oco.Ocorrencia_bairro = dr["ocorrencia_bairro"].ToString();
                    oco.Ocorrencia_ponto_ref = dr["ocorrencia_ponto_ref"].ToString();
                    oco.Ocorrencia_cep = dr["ocorrencia_cep"].ToString();
                    oco.Denunciante_nome = dr["denunciante_nome"].ToString();
                    oco.Denunciante_email = dr["denunciante_email"].ToString();
                    oco.Denunciante_celular = dr["denunciante_celular"].ToString();
                    oco.Ocorrencia_envio = dr["ocorrencia_envio"].ToString();
                    oco.Ocorrencia_imagem = dr["ocorrencia_imagem"].ToString();
                    oco.Ocorrencia_data_cadastro = DateTime.Parse(dr["ocorrencia_data_cadastro"].ToString());
                    oco.Ocorrencia_data_conclusao = DateTime.Parse(dr["ocorrencia_data_conclusao"].ToString());
                    oco.Ocorrencia_situacao = dr["ocorrencia_situacao"].ToString();

                    array.Add(oco);
                }
            }
                return array;
        }

    }//fim classe
}//fim namespace
